////通过EXCEL注解 并且传入需要导出的字段名 导出成EXCEL表格
//
//package com.util.utils;
//
//
//
//import com.sun.org.slf4j.internal.Logger;
//import com.sun.org.slf4j.internal.LoggerFactory;
//
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.lang.reflect.Field;
//import java.text.DecimalFormat;
//import java.text.SimpleDateFormat;
//import java.util.*;
//
///**
// * Excel导出工具类
// */
//public class CreateExcelUtil<T> {
//    private static final Logger log = LoggerFactory.getLogger(CreateExcelUtil.class);
//
//    /**
//     * Excel sheet最大行数，默认65536
//     */
//    public static final int sheetSize = 65536;
//
//    /**
//     * 工作表名称
//     */
//    private String sheetName;
//
//    /**
//     * 导出类型（EXPORT:导出数据；IMPORT：导入模板）
//     */
//    private Type type;
//
//    /**
//     * 工作薄对象
//     */
//    private Workbook wb;
//
//    /**
//     * 工作表对象
//     */
//    private Sheet sheet;
//
//    /**
//     * 样式列表
//     */
//    private Map<String, CellStyle> styles;
//
//    /**
//     * 导出数据列表
//     */
//    private List<T> list;
//
//    /**
//     * 注解列表
//     */
//    private List<Field> fields;
//
//    /**
//     * 当前行号
//     */
//    private int rownum;
//
//    /**
//     * 需要导出的字段
//     */
//    private String[] exportFields;
//
//    /**
//     * 统计列表
//     */
//    private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
//
//    /**
//     * 数字格式
//     */
//    private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
//
//    /**
//     * 实体对象
//     */
//    public Class<T> clazz;
//
//    public CreateExcelUtil(Class<T> clazz) {
//        this.clazz = clazz;
//    }
//
//    public void init(List<T> list, String sheetName, String[] exportFields) {
//        if (list == null) {
//            list = new ArrayList<T>();
//        }
//        this.list = list;
//        this.sheetName = sheetName;
//        this.type = Type.EXPORT;
//        this.exportFields = exportFields;
//        createWorkbook();
//        createExcelField();
//        createSheet();
//    }
//
//    /**
//     * 创建一个工作簿
//     */
//    public void createWorkbook() {
//        this.wb = new SXSSFWorkbook(500);
//        this.sheet = null;
//    }
//
//    /**
//     * 创建工作表
//     */
//    public void createSheet() {
//        this.sheet = wb.createSheet(sheetName);
//        this.styles = createStyles(wb);
//        // 设置工作表的默认列宽
//        this.sheet.setDefaultColumnWidth(20);
//    }
//
//    /**
//     * 创建表格样式
//     */
//    private Map<String, CellStyle> createStyles(Workbook wb) {
//        // 写入各条记录,每条记录对应excel表中的一行
//        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
//        CellStyle style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        Font titleFont = wb.createFont();
//        titleFont.setFontName("Arial");
//        titleFont.setFontHeightInPoints((short) 16);
//        titleFont.setBold(true);
//        style.setFont(titleFont);
//        styles.put("title", style);
//
//        style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        style.setBorderRight(BorderStyle.THIN);
//        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderLeft(BorderStyle.THIN);
//        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderTop(BorderStyle.THIN);
//        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderBottom(BorderStyle.THIN);
//        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        Font dataFont = wb.createFont();
//        dataFont.setFontName("Arial");
//        dataFont.setFontHeightInPoints((short) 10);
//        style.setFont(dataFont);
//        styles.put("data", style);
//
//        style = wb.createCellStyle();
//        style.cloneStyleFrom(styles.get("data"));
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//        Font headerFont = wb.createFont();
//        headerFont.setFontName("Arial");
//        headerFont.setFontHeightInPoints((short) 10);
//        headerFont.setBold(true);
//        headerFont.setColor(IndexedColors.WHITE.getIndex());
//        style.setFont(headerFont);
//        styles.put("header", style);
//
//        style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        Font totalFont = wb.createFont();
//        totalFont.setFontName("Arial");
//        totalFont.setFontHeightInPoints((short) 10);
//        style.setFont(totalFont);
//        styles.put("total", style);
//
//        return styles;
//    }
//
//    /**
//     * 得到所有定义字段
//     */
//    private void createExcelField() {
//        this.fields = new ArrayList<Field>();
//        List<Field> tempFields = new ArrayList<>();
//
//        // 获取所有字段，包括父类
//        for (Class<?> tempClass = clazz; tempClass != Object.class; tempClass = tempClass.getSuperclass()) {
//            tempFields.addAll(Arrays.asList(tempClass.getDeclaredFields()));
//        }
//
//        // 过滤出需要导出的字段
//        if (exportFields != null && exportFields.length > 0) {
//            // 需要导出指定字段
//            for (Field field : tempFields) {
//                Excel attr = field.getAnnotation(Excel.class);
//                if (attr != null) {
//                    // 如果是导出的字段，添加到fields中
//                    for (String exportField : exportFields) {
//                        if (field.getName().equals(exportField)) {
//                            fields.add(field);
//                            break;
//                        }
//                    }
//                }
//            }
//        } else {
//            // 导出全部字段
//            for (Field field : tempFields) {
//                if (field.isAnnotationPresent(Excel.class)) {
//                    fields.add(field);
//                }
//            }
//        }
//    }
//
//    /**
//     * 创建写入数据到Sheet
//     */
//    public void exportExcel() {
//        try {
//            // 创建表格标题
//            writeHeader();
//            // 写入数据
//            writeRows();
//            // 合计数据
//            writeSumRow();
//        } catch (Exception e) {
//            log.error("导出Excel异常", e);
//            throw new RuntimeException("导出Excel失败，请联系网站管理员！");
//        }
//    }
//
//    /**
//     * 写入第一行表头
//     */
//    private void writeHeader() throws IOException {
//        // 创建第一行表头
//        Row headerRow = sheet.createRow(rownum++);
//        headerRow.setHeight((short) 450);
//
//        // 写入列头
//        for (int i = 0; i < fields.size(); i++) {
//            Field field = fields.get(i);
//            Excel attr = field.getAnnotation(Excel.class);
//            // 创建列
//            Cell cell = headerRow.createCell(i);
//            // 设置列中写入的内容
//            cell.setCellValue(attr.name());
//            cell.setCellStyle(styles.get("header"));
//        }
//        Cell cell = headerRow.createCell(fields.size());
//        cell.setCellValue("审核状态");
//        cell.setCellStyle(styles.get("header"));
//    }
//
//    /**
//     * 写入各行数据
//     */
//    private void writeRows() throws Exception {
//        // 写入各条记录,每条记录对应excel表中的一行
//        CellStyle cs = styles.get("data");
//        for (T vo : list) {
//            // 如果行超过了最大值，创建一个新的工作表
//            if (rownum >= sheetSize) {
//                sheet = wb.createSheet();
//                // 设置工作表的默认列宽
//                sheet.setDefaultColumnWidth(20);
//                // 重置行号
//                rownum = 0;
//                // 重新写入列头
//                writeHeader();
//            }
//            // 创建行
//            Row row = sheet.createRow(rownum++);
//            // 写入各个字段
//            for (int i = 0; i < fields.size(); i++) {
//                // 获取字段
//                Field field = fields.get(i);
//                // 设置实体类私有属性可访问
//                field.setAccessible(true);
//                // 创建单元格
//                Cell cell = row.createCell(i);
//                cell.setCellStyle(cs);
//                if (i == fields.size() - 1){
//                    Cell cellLast = row.createCell(i + 1);
//                    cellLast.setCellStyle(cs);
//                }
//                // 获取列值
//                Object value = field.get(vo);
//                // 获取字段注解
//                Excel attr = field.getAnnotation(Excel.class);
//                // 根据字段类型设置单元格的值
//                setCellValue(value, attr, cell);
//            }
//        }
//    }
//
//    /**
//     * 设置单元格的值
//     *
//     * @param value 值
//     * @param attr 注解
//     * @param cell 单元格
//     */
//    private void setCellValue(Object value, Excel attr, Cell cell) {
//        if (value == null) {
//            cell.setCellValue("");
//            return;
//        }
//
//        String dateFormat = attr != null && attr.dateFormat().length() > 0 ? attr.dateFormat() : "yyyy-MM-dd";
//        String readConverterExp = attr != null ? attr.readConverterExp() : "";
//        Excel.ColumnType cellType = attr != null ? attr.cellType() : Excel.ColumnType.STRING;
//
//        if (value instanceof Date) {
//            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
//            cell.setCellValue(sdf.format((Date) value));
//        } else if (value instanceof String) {
//            String s = value.toString();
//            // 如果有枚举型数据
//            if (StringUtils.isNotEmpty(readConverterExp)) {
//                cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));
//            } else {
//                cell.setCellValue(s);
//            }
//        } else if (value instanceof Integer) {
//            cell.setCellValue((Integer) value);
//        } else if (value instanceof Long) {
//            cell.setCellValue((Long) value);
//        } else if (value instanceof Double) {
//            cell.setCellValue((Double) value);
//        } else if (value instanceof Float) {
//            cell.setCellValue((Float) value);
//        } else if (value instanceof Boolean) {
//            cell.setCellValue((Boolean) value);
//        } else {
//            cell.setCellValue(value.toString());
//        }
//    }
//
//    /**
//     * 写入合计行
//     */
//    private void writeSumRow() {
//        if (statistics.size() > 0) {
//            Row row = sheet.createRow(rownum++);
//            Cell sumCell = row.createCell(0);
//            sumCell.setCellStyle(styles.get("total"));
//            sumCell.setCellValue("合计");
//
//            for (Map.Entry<Integer, Double> entry : statistics.entrySet()) {
//                Cell cell = row.createCell(entry.getKey());
//                cell.setCellStyle(styles.get("total"));
//                cell.setCellValue(DOUBLE_FORMAT.format(entry.getValue()));
//            }
//            statistics.clear();
//        }
//    }
//
//    /**
//     * 将Excel写入到指定目录
//     *
//     * @param filePath 文件路径
//     * @return 写入结果
//     */
//    public String writeFile(String filePath) throws IOException {
//        // 确保目录存在
//        File parent = new File(filePath).getParentFile();
//        if (!parent.exists()) {
//            parent.mkdirs();
//        }
//
//        try (FileOutputStream fos = new FileOutputStream(filePath)) {
//            wb.write(fos);
//            return filePath;
//        } catch (IOException e) {
//            throw e;
//        } finally {
//            if (wb != null) {
//                try {
//                    wb.close();
//                } catch (IOException e) {
//                    log.error("关闭工作簿异常", e);
//                }
//            }
//        }
//    }
//
//    /**
//     * 解析导出值 0=男,1=女,2=未知
//     *
//     * @param propertyValue 参数值
//     * @param converterExp 翻译注解
//     * @return 解析后值
//     */
//    private String convertByExp(String propertyValue, String converterExp) {
//        String[] convertSource = converterExp.split(",");
//        for (String item : convertSource) {
//            String[] itemArray = item.split("=");
//            if (itemArray.length == 2 && itemArray[0].equals(propertyValue)) {
//                return itemArray[1];
//            }
//        }
//        return propertyValue;
//    }
//
//    /**
//     * 导出类型（EXPORT:导出数据；IMPORT：导入模板）
//     */
//    public enum Type {
//        EXPORT, IMPORT
//    }
//}
